import pandas as pd
import re
import jieba
import jieba.posseg as pseg
from pypinyin import lazy_pinyin
import os
import difflib
from typing import List, Dict, Tuple
import logging

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

class CommentProcessor:
    """评论处理器"""
    
    def __init__(self):
        # 初始化店铺名称词典
        self.shop_names = self._load_shop_names()
        # 初始化表情包词典
        self.emojis = self._load_emojis()
        # 初始化差评关键词
        self.negative_keywords = self._load_negative_keywords()
        # 初始化错别字词典
        self.typo_dict = self._load_typo_dict()
        # 存储已处理的评论，用于去重
        self.processed_comments = set()
        
    def _load_shop_names(self) -> List[str]:
        """加载店铺名称词典"""
        shop_names = [
            "欢潮", "转珠棒", "情趣用品", "成人用品", "性用品", "情趣", "成人", "用品",
            "淘宝", "天猫", "京东", "拼多多", "微店", "店铺", "商家", "卖家",
            "官方", "旗舰店", "专卖店", "专营店", "直营店", "品牌店"
        ]
        return shop_names
    
    def _load_emojis(self) -> List[str]:
        """加载表情包词典"""
        emojis = [
            "😀", "😃", "😄", "😁", "😆", "😅", "😂", "🤣", "😊", "😇",
            "🙂", "🙃", "😉", "😌", "😍", "🥰", "😘", "😗", "😙", "😚",
            "😋", "😛", "😝", "😜", "🤪", "🤨", "🧐", "🤓", "😎", "🤩",
            "🥳", "😏", "😒", "😞", "😔", "😟", "😕", "🙁", "☹️", "😣",
            "😖", "😫", "😩", "🥺", "😢", "😭", "😤", "😠", "😡", "🤬",
            "🤯", "😳", "🥵", "🥶", "😱", "😨", "😰", "😥", "😓", "🤗",
            "🤔", "🤭", "🤫", "🤥", "😶", "😐", "😑", "😯", "😦", "😧",
            "😮", "😲", "🥱", "😴", "🤤", "😪", "😵", "🤐", "🥴", "🤢",
            "🤮", "🤧", "😷", "🤒", "🤕", "🤑", "🤠", "💩", "👻", "💀",
            "☠️", "👽", "👾", "🤖", "😺", "😸", "😹", "😻", "😼", "😽",
            "🙀", "😿", "😾", "🙈", "🙉", "🙊", "👶", "👧", "🧒", "👦",
            "👩", "🧑", "👨", "👵", "🧓", "👴", "👮‍♀️", "👮", "👮‍♂️", "🕵️‍♀️",
            "🕵️", "🕵️‍♂️", "💂‍♀️", "💂", "💂‍♂️", "👷‍♀️", "👷", "👷‍♂️", "🤴", "👸",
            "👳‍♀️", "👳", "👳‍♂️", "👲", "🧕", "🤵", "👰", "🤰", "🤱", "👼",
            "🎅", "🤶", "🧙‍♀️", "🧙", "🧙‍♂️", "🧝‍♀️", "🧝", "🧝‍♂️", "🧛‍♀️", "🧛",
            "🧛‍♂️", "🧟‍♀️", "🧟", "🧟‍♂️", "🧞‍♀️", "🧞", "🧞‍♂️", "🧜‍♀️", "🧜", "🧜‍♂️",
            "🧚‍♀️", "🧚", "🧚‍♂️", "👼", "🤰", "🤱", "👼", "🎅", "🤶", "🧙‍♀️",
            "👍", "👎", "👌", "✌️", "🤞", "🤟", "🤘", "🤙", "👈", "👉",
            "👆", "🖕", "👇", "☝️", "👋", "🤚", "🖐️", "✋", "🖖", "👌",
            "🤌", "🤏", "✌️", "🤞", "🤟", "🤘", "🤙", "👈", "👉", "👆",
            "🖕", "👇", "☝️", "👋", "🤚", "🖐️", "✋", "🖖", "👌", "🤌",
            "❤️", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤍", "🤎", "💔",
            "❣️", "💕", "💞", "💓", "💗", "💖", "💘", "💝", "💟", "☮️",
            "✝️", "☪️", "🕉️", "☸️", "✡️", "🔯", "🕎", "☯️", "☦️", "🛐",
            "⛎", "♈", "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐",
            "♑", "♒", "♓", "🆔", "⚛️", "🉑", "☢️", "☣️", "📴", "📳",
            "🈶", "🈚", "🈸", "🈺", "🈷️", "✴️", "🆚", "💮", "🉐", "㊙️",
            "㊗️", "🈴", "🈵", "🈹", "🈲", "🅰️", "🅱️", "🆎", "🆑", "🅾️",
            "🆘", "❌", "⭕", "🛑", "⛔", "📛", "🚫", "💯", "💢", "♨️",
            "🚷", "🚯", "🚳", "🚱", "🔞", "📵", "🚭", "❗", "❕", "❓",
            "❔", "‼️", "⁉️", "🔅", "🔆", "〽️", "⚠️", "🚸", "🔱", "⚜️",
            "🔰", "♻️", "✅", "🈯", "💹", "❇️", "✳️", "❎", "🌐", "💠",
            "Ⓜ️", "🌀", "💤", "🏧", "🚾", "♿", "🅿️", "🛗", "🛂", "🛃",
            "🛄", "🛅", "🚹", "🚺", "🚼", "🚻", "🚮", "🎦", "📶", "🈁",
            "🔣", "ℹ️", "🔤", "🔡", "🔠", "🆖", "🆗", "🆙", "🆒", "🆕",
            "🆓", "0️⃣", "1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣",
            "9️⃣", "🔟", "🔢", "#️⃣", "*️⃣", "⏏️", "▶️", "⏸️", "⏯️", "⏹️",
            "⏺️", "⏭️", "⏮️", "⏩", "⏪", "⏫", "⏬", "◀️", "🔼", "🔽",
            "➡️", "⬅️", "⬆️", "⬇️", "↗️", "↘️", "↙️", "↖️", "↕️", "↔️",
            "↪️", "↩️", "⤴️", "⤵️", "🔀", "🔁", "🔂", "🔄", "🔃", "🎵",
            "🎶", "➕", "➖", "➗", "✖️", "♾️", "💲", "💱", "™️", "©️",
            "®️", "👁️‍🗨️", "🔚", "🔙", "🔛", "🔝", "🔜", "〰️", "➰", "➿",
            "✔️", "☑️", "🔘", "🔴", "🟠", "🟡", "🟢", "🔵", "🟣", "⚫",
            "⚪", "🟤", "🔺", "🔻", "🔸", "🔹", "🔶", "🔷", "🔳", "🔲",
            "▪️", "▫️", "◾", "◽", "◼️", "◻️", "🟥", "🟧", "🟨", "🟩",
            "🟦", "🟪", "⬛", "⬜", "🟫", "🔈", "🔇", "🔉", "🔊", "🔔",
            "🔕", "📣", "📢", "💬", "💭", "🗯️", "♠️", "♣️", "♥️", "♦️",
            "🃏", "🎴", "🀄", "🕐", "🕑", "🕒", "🕓", "🕔", "🕕", "🕖",
            "🕗", "🕘", "🕙", "🕚", "🕛", "🕜", "🕝", "🕞", "🕟", "🕠",
            "🕡", "🕢", "🕣", "🕤", "🕥", "🕦", "🕧"
        ]
        return emojis
    
    def _load_negative_keywords(self) -> List[str]:
        """加载差评关键词"""
        negative_keywords = [
            "差", "烂", "坏", "不好", "不行", "垃圾", "坑", "骗", "假", "伪劣",
            "退货", "退款", "投诉", "差评", "不满意", "失望", "后悔", "上当", "受骗",
            "质量问题", "破损", "损坏", "断裂", "漏", "坏掉", "不能用", "不工作",
            "故障", "问题", "缺陷", "瑕疵", "划痕", "污渍", "异味", "味道不好",
            "尺寸不对", "颜色不对", "款式不对", "材质不好", "手感差", "做工差",
            "包装差", "物流慢", "服务差", "态度差", "客服差", "不回复", "不理人",
            "敷衍", "推脱", "推卸", "不负责任", "不专业", "不靠谱", "不推荐",
            "别买", "不要买", "千万别买", "浪费钱", "不值", "性价比低", "贵",
            "太贵", "价格高", "不值这个价", "亏了", "亏大了", "血亏", "血本无归"
        ]
        return negative_keywords
    
    def _load_typo_dict(self) -> Dict[str, str]:
        """加载错别字词典"""
        typo_dict = {
            "的的": "的",
            "了了": "了",
            "是是": "是",
            "在在": "在",
            "有有": "有",
            "和和": "和",
            "与与": "与",
            "或或": "或",
            "但但": "但",
            "而而": "而",
            "因因": "因",
            "为为": "为",
            "所所以": "所以",
            "因因为": "因为",
            "虽虽然": "虽然",
            "但但是": "但是",
            "如如果": "如果",
            "假假如": "假如",
            "要要是": "要是",
            "除除了": "除了",
            "关关于": "关于",
            "对对于": "对于",
            "由由于": "由于",
            "根根据": "根据",
            "按按照": "按照",
            "根根据": "根据",
            "通通过": "通过",
            "经经过": "经过",
            "经经历": "经历",
            "体体验": "体验",
            "使使用": "使用",
            "购购买": "购买",
            "买买": "买",
            "卖卖": "卖",
            "商商品": "商品",
            "产产品": "产品",
            "质质量": "质量",
            "服服务": "服务",
            "态态度": "态度",
            "速速度": "速度",
            "快快递": "快递",
            "物物流": "物流",
            "包包装": "包装",
            "外外观": "外观",
            "颜颜色": "颜色",
            "尺尺寸": "尺寸",
            "大大小": "大小",
            "长长": "长",
            "宽宽": "宽",
            "高高": "高",
            "重重": "重",
            "轻轻": "轻",
            "软软": "软",
            "硬硬": "硬",
            "粗粗": "粗",
            "细细": "细",
            "厚厚": "厚",
            "薄薄": "薄",
            "新新": "新",
            "旧旧": "旧",
            "好好": "好",
            "坏坏": "坏",
            "美美": "美",
            "丑丑": "丑",
            "漂漂亮": "漂亮",
            "美美丽": "美丽",
            "可可爱": "可爱",
            "帅帅气": "帅气",
            "酷酷": "酷",
            "时时尚": "时尚",
            "流流行": "流行",
            "潮潮流": "潮流",
            "品品牌": "品牌",
            "名名牌": "名牌",
            "高高端": "高端",
            "低低端": "低端",
            "中中端": "中端",
            "价价格": "价格",
            "成成本": "成本",
            "利利润": "利润",
            "收收入": "收入",
            "支支出": "支出",
            "费费用": "费用",
            "成成本": "成本",
            "投投资": "投资",
            "回回报": "回报",
            "收收益": "收益",
            "风风险": "风险",
            "机机会": "机会",
            "挑挑战": "挑战",
            "困困难": "困难",
            "问问题": "问题",
            "解解决": "解决",
            "处处理": "处理",
            "管管理": "管理",
            "控控制": "控制",
            "调调整": "调整",
            "改改变": "改变",
            "变变化": "变化",
            "发发展": "发展",
            "进进步": "进步",
            "提提高": "提高",
            "增增加": "增加",
            "减减少": "减少",
            "升上升": "上升",
            "下下降": "下降",
            "左左边": "左边",
            "右右边": "右边",
            "上上面": "上面",
            "下下面": "下面",
            "前前面": "前面",
            "后后面": "后面",
            "里里面": "里面",
            "外外面": "外面",
            "内内部": "内部",
            "外外部": "外部",
            "中中间": "中间",
            "中中心": "中心",
            "边边缘": "边缘",
            "角角落": "角落",
            "端端点": "端点",
            "顶顶部": "顶部",
            "底底部": "底部",
            "侧侧面": "侧面",
            "正正面": "正面",
            "反反面": "反面",
            "表表面": "表面",
            "深深度": "深度",
            "高高度": "高度",
            "宽宽度": "宽度",
            "长长度": "长度",
            "厚厚度": "厚度",
            "薄薄度": "薄度",
            "重重度": "重度",
            "轻轻度": "轻度",
            "强强度": "强度",
            "弱弱度": "弱度",
            "硬硬度": "硬度",
            "软软度": "软度",
            "粗粗糙": "粗糙",
            "光光滑": "光滑",
            "平平滑": "平滑",
            "粗粗糙": "粗糙",
            "细细腻": "细腻",
            "粗粗糙": "粗糙",
            "光光泽": "光泽",
            "暗暗淡": "暗淡",
            "明明亮": "明亮",
            "暗暗沉": "暗沉",
            "鲜鲜艳": "鲜艳",
            "淡淡雅": "淡雅",
            "深深沉": "深沉",
            "浅浅淡": "浅淡",
            "浓浓厚": "浓厚",
            "淡淡薄": "淡薄",
            "香香浓": "香浓",
            "臭臭气": "臭气",
            "甜甜美": "甜美",
            "苦苦涩": "苦涩",
            "酸酸味": "酸味",
            "辣辣味": "辣味",
            "咸咸味": "咸味",
            "鲜鲜美": "鲜美",
            "美美味": "美味",
            "好好吃": "好吃",
            "难难吃": "难吃",
            "香香喷喷": "香喷喷",
            "臭臭烘烘": "臭烘烘",
            "甜甜滋滋": "甜滋滋",
            "苦苦哈哈": "苦哈哈",
            "酸酸溜溜": "酸溜溜",
            "辣辣乎乎": "辣乎乎",
            "咸咸津津": "咸津津",
            "鲜鲜嫩嫩": "鲜嫩嫩",
            "美美滋滋": "美滋滋",
            "好好好好": "好好",
            "坏坏坏坏": "坏坏",
            "美美美美": "美美",
            "丑丑丑丑": "丑丑",
            "新新新新": "新新",
            "旧旧旧旧": "旧旧",
            "大大小大": "大小",
            "小大大小": "大小",
            "长长短短": "长短",
            "短短短长": "短长",
            "宽宽窄窄": "宽窄",
            "窄窄宽宽": "窄宽",
            "高高矮矮": "高矮",
            "矮矮高高": "矮高",
            "重重轻轻": "重轻",
            "轻轻重重": "轻重",
            "厚厚薄薄": "厚薄",
            "薄薄厚厚": "薄厚",
            "粗粗细细": "粗细",
            "细细粗粗": "细粗",
            "软软硬硬": "软硬",
            "硬硬软软": "硬软",
            "快快慢慢": "快慢",
            "慢慢快快": "慢快",
            "早早晚晚": "早晚",
            "晚晚早早": "晚早",
            "热热冷冷": "热冷",
            "冷冷热热": "冷热",
            "干干湿湿": "干湿",
            "湿湿干干": "湿干",
            "亮亮暗暗": "亮暗",
            "暗暗亮亮": "暗亮",
            "开开关关": "开关",
            "关关开开": "关开",
            "进进出出": "进出",
            "出出进进": "出进",
            "上上下下": "上下",
            "下下上上": "下上",
            "左左右右": "左右",
            "右右左左": "右左",
            "前前后后": "前后",
            "后后前前": "后前",
            "里里外外": "里外",
            "外外里里": "外里",
            "内内外外": "内外",
            "外外内内": "外内",
            "中中边边": "中边",
            "边边中中": "边中",
            "正正反反": "正反",
            "反反正正": "反正",
            "表表里里": "表里",
            "里里表表": "里表",
            "深深浅浅": "深浅",
            "浅浅深深": "浅深",
            "强强弱弱": "强弱",
            "弱弱强强": "弱强",
            "硬硬软软": "硬软",
            "软软硬硬": "软硬",
            "粗粗细细": "粗细",
            "细细粗粗": "细粗",
            "光光滑滑": "光滑",
            "滑滑光光": "滑光",
            "平平滑滑": "平滑",
            "滑滑平平": "滑平",
            "粗粗糙糙": "粗糙",
            "糙糙粗粗": "糙粗",
            "细细腻腻": "细腻",
            "腻腻细细": "腻细",
            "光光泽泽": "光泽",
            "泽泽光光": "泽光",
            "暗暗淡淡": "暗淡",
            "淡淡暗暗": "淡暗",
            "明明亮亮": "明亮",
            "亮亮明明": "亮明",
            "鲜鲜艳艳": "鲜艳",
            "艳艳鲜鲜": "艳鲜",
            "淡淡雅雅": "淡雅",
            "雅雅淡淡": "雅淡",
            "深深沉沉": "深沉",
            "沉沉深深": "沉深",
            "浅浅淡淡": "浅淡",
            "淡淡浅浅": "淡浅",
            "浓浓厚厚": "浓厚",
            "厚厚浓浓": "厚浓",
            "香香浓浓": "香浓",
            "浓浓香香": "浓香",
            "臭臭气气": "臭气",
            "气气臭臭": "气臭",
            "甜甜美美": "甜美",
            "美美甜甜": "美甜",
            "苦苦涩涩": "苦涩",
            "涩涩苦苦": "涩苦",
            "酸酸味味": "酸味",
            "味味酸酸": "味酸",
            "辣辣味味": "辣味",
            "味味辣辣": "味辣",
            "咸咸味味": "咸味",
            "味味咸咸": "味咸",
            "鲜鲜美美": "鲜美",
            "美美鲜鲜": "美鲜",
            "美美味味": "美味",
            "味味美美": "味美",
            "好好吃吃": "好吃",
            "吃吃好好": "吃好",
            "难难吃吃": "难吃",
            "吃吃难难": "吃难"
        }
        return typo_dict
    
    def remove_shop_names(self, text: str) -> str:
        """去除字符串中的店铺名称"""
        if not text or not isinstance(text, str):
            return text
        
        result = text
        for shop_name in self.shop_names:
            result = result.replace(shop_name, "")
        
        # 去除多余的空格
        result = re.sub(r'\s+', ' ', result).strip()
        return result
    
    def remove_emojis(self, text: str) -> str:
        """去除字符串中的表情包和特殊符号"""
        if not text or not isinstance(text, str):
            return text
        
        result = text
        
        # 去除表情包
        for emoji in self.emojis:
            result = result.replace(emoji, "")
        
        # 去除其他可能的emoji字符
        result = re.sub(r'[\U0001F600-\U0001F64F]', '', result)  # 表情符号
        result = re.sub(r'[\U0001F300-\U0001F5FF]', '', result)  # 杂项符号和象形文字
        result = re.sub(r'[\U0001F680-\U0001F6FF]', '', result)  # 交通和地图符号
        result = re.sub(r'[\U0001F1E0-\U0001F1FF]', '', result)  # 区域指示符号
        result = re.sub(r'[\U00002600-\U000027BF]', '', result)  # 杂项符号
        result = re.sub(r'[\U0001F900-\U0001F9FF]', '', result)  # 补充符号和象形文字
        
        # 去除星号(*) - 包括单个星号和多个星号
        result = re.sub(r'\*+', '', result)
        
        # 去除其他常见特殊符号
        result = re.sub(r'[★☆✩✪✫✬✭✮✯✰]', '', result)  # 各种星形符号
        result = re.sub(r'[♥♡❤💖💗💘💙💚💛💜💝💞💟]', '', result)  # 心形符号
        result = re.sub(r'[♪♫♬♩♭♮♯]', '', result)  # 音乐符号
        result = re.sub(r'[☀☁☂☃☄★☆☎☏⊙◎☺☻☼▧▨♨◐◑↔↕▪▒◊◦▣▤▥▦▧▨▩]', '', result)  # 其他符号
        
        # 去除多余的空格
        result = re.sub(r'\s+', ' ', result).strip()
        return result
    
    def correct_typos(self, text: str) -> str:
        """纠正错别字和不通顺的语句"""
        if not text or not isinstance(text, str):
            return text
        
        result = text
        
        # 纠正错别字
        for typo, correct in self.typo_dict.items():
            result = result.replace(typo, correct)
        
        # 替换特定词汇
        result = result.replace('掌柜', '客服')
        
        # 去除重复的标点符号
        result = re.sub(r'[。，！？；：""''（）【】]{2,}', lambda m: m.group()[0], result)
        
        # 去除重复的字符（超过3个相同字符）
        result = re.sub(r'(.)\1{3,}', r'\1\1\1', result)
        
        # 去除多余的空格
        result = re.sub(r'\s+', ' ', result).strip()
        
        return result
    
    def contains_negative_keywords(self, text: str) -> bool:
        """判断评论中是否包含差评关键词"""
        if not text or not isinstance(text, str):
            return False
        
        text_lower = text.lower()
        for keyword in self.negative_keywords:
            if keyword in text_lower:
                return True
        return False
    
    def is_duplicate_comment(self, text: str, threshold: float = 0.8) -> bool:
        """判断评论是否与已有评论重复"""
        if not text or not isinstance(text, str):
            return False
        
        text_clean = self.clean_text_for_comparison(text)
        
        for existing_comment in self.processed_comments:
            existing_clean = self.clean_text_for_comparison(existing_comment)
            similarity = difflib.SequenceMatcher(None, text_clean, existing_clean).ratio()
            if similarity >= threshold:
                return True
        
        return False
    
    def clean_text_for_comparison(self, text: str) -> str:
        """清理文本用于比较"""
        if not text:
            return ""
        
        # 去除标点符号和空格
        text = re.sub(r'[^\w\s]', '', text)
        text = re.sub(r'\s+', '', text)
        return text.lower()
    
    def process_comment(self, text: str) -> Tuple[str, Dict[str, bool]]:
        """处理单条评论"""
        if not text or not isinstance(text, str):
            return text, {"is_negative": False, "is_duplicate": False}
        
        original_text = text
        result = text
        
        # 1. 去除店铺名称
        result = self.remove_shop_names(result)
        
        # 2. 去除表情包
        result = self.remove_emojis(result)
        
        # 3. 纠正错别字
        result = self.correct_typos(result)
        
        # 4. 检查是否包含差评关键词
        is_negative = self.contains_negative_keywords(result)
        
        # 5. 检查是否重复
        is_duplicate = self.is_duplicate_comment(result)
        
        # 如果不是差评且不重复，添加到已处理评论集合中
        if not is_negative and not is_duplicate:
            self.processed_comments.add(result)
        
        return result, {
            "is_negative": is_negative,
            "is_duplicate": is_duplicate,
            "original_length": len(original_text),
            "processed_length": len(result)
        }
    
    def process_excel_file(self, file_path: str, output_path: str = None) -> pd.DataFrame:
        """处理Excel文件"""
        try:
            logger.info(f"开始处理文件: {file_path}")
            
            # 读取Excel文件
            df = pd.read_excel(file_path)
            logger.info(f"成功读取文件，共 {len(df)} 行数据")
            
            # 查找评论列
            comment_columns = []
            for col in df.columns:
                if any(keyword in str(col).lower() for keyword in ['评论', 'comment', '评价', '反馈', '留言']):
                    comment_columns.append(col)
            
            if not comment_columns:
                logger.warning("未找到评论列，尝试处理所有文本列")
                comment_columns = [col for col in df.columns if df[col].dtype == 'object']
            
            logger.info(f"找到评论列: {comment_columns}")
            
            # 处理每个评论列
            for col in comment_columns:
                logger.info(f"处理列: {col}")
                
                # 创建新列存储处理结果
                df[f'{col}_processed'] = ''
                df[f'{col}_is_negative'] = False
                df[f'{col}_is_duplicate'] = False
                df[f'{col}_original_length'] = 0
                df[f'{col}_processed_length'] = 0
                
                # 处理每一行
                for idx, row in df.iterrows():
                    comment = row[col]
                    if pd.notna(comment) and str(comment).strip():
                        processed_comment, info = self.process_comment(str(comment))
                        
                        df.at[idx, f'{col}_processed'] = processed_comment
                        df.at[idx, f'{col}_is_negative'] = info['is_negative']
                        df.at[idx, f'{col}_is_duplicate'] = info['is_duplicate']
                        df.at[idx, f'{col}_original_length'] = info['original_length']
                        df.at[idx, f'{col}_processed_length'] = info['processed_length']
            
            # 保存处理结果
            if output_path is None:
                base_name = os.path.splitext(file_path)[0]
                output_path = f"{base_name}_processed.xlsx"
            
            df.to_excel(output_path, index=False)
            logger.info(f"处理完成，结果保存到: {output_path}")
            
            return df
            
        except Exception as e:
            logger.error(f"处理文件时出错: {str(e)}")
            raise
    
    def process_comments_folder(self, folder_path: str = "comments", output_folder: str = "output"):
        """处理comments文件夹下的所有Excel文件"""
        try:
            # 创建输出文件夹
            os.makedirs(output_folder, exist_ok=True)
            
            # 获取所有Excel文件
            excel_files = []
            for file in os.listdir(folder_path):
                if file.endswith(('.xlsx', '.xls')):
                    excel_files.append(os.path.join(folder_path, file))
            
            if not excel_files:
                logger.warning(f"在 {folder_path} 文件夹中未找到Excel文件")
                return
            
            logger.info(f"找到 {len(excel_files)} 个Excel文件")
            
            # 处理每个文件
            for file_path in excel_files:
                try:
                    file_name = os.path.basename(file_path)
                    output_path = os.path.join(output_folder, f"processed_{file_name}")
                    
                    logger.info(f"开始处理: {file_name}")
                    self.process_excel_file(file_path, output_path)
                    logger.info(f"完成处理: {file_name}")
                    
                except Exception as e:
                    logger.error(f"处理文件 {file_path} 时出错: {str(e)}")
                    continue
            
            logger.info("所有文件处理完成")
            
        except Exception as e:
            logger.error(f"处理文件夹时出错: {str(e)}")
            raise 